<?php
/**
 * @Name: 数据库操作类
 * @Author: Veris
 * @Date:   2015-12-13 20:25:09
 * @Last Modified by:   Veris
 * @Last Modified time: 2016-05-02 23:21:54
 */
    class DB{
        private $link;    //当前数据库连接标识
        private $field;   //字段名
        private $where;   //条件
        private $order;   //排序规则
        private $limit;   //截取范围

        public function __construct($cfg=null){
            if($cfg==null){
                die('请加载数据库配置！');
            }
            $dsn="{$cfg['type']}:host={$cfg['host']};dbname={$cfg['name']};charset={$cfg['char']};port={$cfg['port']};";
            $this->link=new PDO($dsn,$cfg['user'],$cfg['pass']);
            // var_dump($this->link);
        }

        /**
         * 加载组件(加载完自动释放)
         * @param  String $attr 组件名
         * @return String       组件值
         */
        private function load($attr){
            if($attr=='field'){
                $str='*';
            }else{
                $str='';
            }
            if($this->$attr!=null){
                switch($attr){
                    case 'field':
                        $str='';
                        break;
                    case 'where':
                        $str=' where ';
                        break;
                    case 'order':
                        $str=' order by ';
                        break;
                    case 'limit':
                        $str=' limit ';
                        break;
                }
                $str.=$this->$attr;

                //重置组件
                $this->$attr=null;
            }
            return $str;
        }

        /**
         * 设置需要显示的字段名
         * @param  String $name  字段名
         * @return Object        当前对象
         */
        public function field($field){
            $this->field=$field;
            return $this;
        }

        /**
         * 设置条件
         * @param  String $where 条件表达式
         * @return Object        当前对象
         */
        public function where($where){
            $this->where=$where;
            return $this;
        }

        /**
         * 设置排序规则
         * @param  String $order 排序规则
         * @return Object        当前对象
         */
        public function order($order){
            $this->order=$order;
            return $this;
        }

        /**
         * 设置截取范围
         * @param  String $limit 截取范围
         * @return Object        当前对象
         */
        public function limit($limit){
            $this->limit=$limit;
            return $this;
        }

        /**
         * 添加
         * @param  String $table 表名
         * @param  Array  $table 数据
         * @return Integer       新添加的id号
         */
        public function insert($table=null,$arr=null){
            if($table==null){
                die('添加失败，未指定表名！');
            }
            if($arr==null){
                die('添加失败，未指定数据！');
            }

            $keys='`'.implode('`,`',array_keys($arr)).'`';
            $values='"'.implode('","',array_values($arr)).'"';

            $sql="insert into {$table} ({$keys}) values ({$values})";
            // echo $sql;

            $rs=$this->link->exec($sql);
            if($rs){
                return $this->link->lastInsertId();
            }else{
                return false;
            }
        }


        /**
         * 删除
         * @param  String $table 表名
         * @return Integer       受影响行数
         */
        public function delete($table=null){
            if($table==null){
                die('删除失败，未指定表名！');
            }

            //加载组件
            $where=$this->load('where');
            if($where==''){
                die('执行删除失败，未指定条件！');
            }

            $sql="delete from {$table}{$where}";
            // echo $sql;

            $rs=$this->link->exec($sql);
            return $rs;
        }

        /**
         * 更新
         * @param  String $table 表名
         * @param  Array  $table 数据
         * @return Integer       影响行数
         */
        public function update($table=null,$arr=null){
            if($table==null){
                die('更新失败，未指定表名！');
            }
            if($arr==null){
                die('更新失败，未指定数据！');
            }

            //加载组件
            $where=$this->load('where');
            if($where==''){
                die('执行更新失败，未指定条件！');
            }

            $data='';
            foreach($arr as $k => $v){
                $data.="`{$k}`='{$v}',";
            }
            $data=rtrim($data,',');

            $sql="update {$table} set {$data}{$where}";
            // echo $sql;

            $rs=$this->link->exec($sql);
            return $rs;
        }

        /**
         * 多条查询
         * @param  String $table 表名
         * @return Array/Boolean 结果
         */
        public function select($table=null){
            if($table==null){
                die('多条查询失败，未指定表名！');
            }

            //加载组件
            $field=$this->load('field');
            $where=$this->load('where');
            $order=$this->load('order');
            $limit=$this->load('limit');

            $sql="select {$field} from {$table}{$where}{$order}{$limit}";
            // echo $sql;

            $rs=$this->link->query($sql);
            if($rs){
                return $rs->fetchAll(PDO::FETCH_ASSOC);
            }else{
                return false;
            }
        }

        /**
         * 单条查询
         * @param  String $table 表名
         * @return Array/Boolean 结果
         */
        public function find($table=null){
            if($table==null){
                die('单条查询失败，未指定表名！');
            }

            //加载组件
            $field=$this->load('field');
            $where=$this->load('where');
            $order=$this->load('order');

            $sql="select {$field} from {$table}{$where}{$order}";
            // echo $sql;

            $rs=$this->link->query($sql);
            if($rs){
                return $rs->fetch(PDO::FETCH_ASSOC);
            }else{
                return false;
            }
        }

        /**
         * 获取表字段信息
         * @param  String $table 表名
         * @param  string $mode  模式 [ALL:全部  PRI:主键  COM:普通]
         * @return Array         表字段信息
         */
        public function getFields($table=null,$mode='ALL'){
            if($table==null){
                die('获取字段失败，未指定表名！');
            }
            $sql="desc {$table}";
            // echo $sql;

            $rs=$this->link->query($sql);
            if($rs){
                $rows=$rs->fetchAll(PDO::FETCH_ASSOC);
                switch($mode){
                    case 'PRI':
                        foreach($rows as $v){
                            if($v['Key']=='PRI'){
                                return $v['Field'];
                            }
                        }
                        break;
                    case 'COM':
                        $fields=array();
                        foreach($rows as $v){
                            if($v['Key']!='PRI'){
                                $fields[]=$v['Field'];
                            }
                        }
                        return $fields;
                        break;
                    case 'ALL':
                    default :
                        return array_column($rows,'Field');
                        break;
                }
            }else{
                return false;
            }
        }
    }
?>